package com.gin.no_gay_alliance.fragment.topic;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.ImageButton;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.viewbinding.ViewBinding;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;

import com.gin.nga.response.body.ThreadBody;
import com.gin.no_gay_alliance.R;
import com.gin.no_gay_alliance.customview.PagerButton;
import com.gin.no_gay_alliance.enums.MessageWhat;
import com.gin.no_gay_alliance.exception.RequireParamException;
import com.gin.no_gay_alliance.fragment.base.BaseBindingFragment;
import com.gin.no_gay_alliance.fragment.topic.page.TopicPageFragment;
import com.gin.no_gay_alliance.param.TopicListParam;
import com.gin.no_gay_alliance.viewmodel.TopicItem;

import java.util.List;

/**
 * 主题列表Fragment基类
 *
 * @author : ginstone
 * @version : v1.0.0
 * @since : 2023/9/5 09:33
 **/
public abstract class BaseTopicListFragment<T extends ViewBinding> extends BaseBindingFragment<T> implements View.OnClickListener, PagerButton.OnPageChangedListener {
    private static final String ARG_KEY = TopicListParam.class.getName();
    /**
     * 参数
     */
    protected TopicListParam param;
    /**
     * 主题列表分页ViewPager2
     */
    protected ViewPager2 viewPager2;
    /**
     * 主题列表分页适配器
     */
    protected FragmentStateAdapter adapter;
    /**
     * 翻页器
     */
    protected PagerButton pagerButton;
    /**
     * 刷新按钮
     */
    protected ImageButton refreshButton;
    /**
     * 最大页数
     */
    protected int totalPage = 1;
    /**
     * 主题列表项是否显示复选框
     */
    protected boolean showCheckBox = false;
    /**
     * 当前页
     */
    protected int page = 1;

    /**
     * 提供布局文件中的翻页按钮
     *
     * @return {@link PagerButton}
     */
    @NonNull
    protected abstract PagerButton initPagerButton();

    /**
     * 提供布局文件中的刷新按钮
     *
     * @return {@link ImageButton}
     */
    @NonNull
    protected abstract ImageButton initRefreshButton();

    /**
     * 提供布局文件中的 主题列表分页ViewPager2
     *
     * @return ViewPager2
     */
    @NonNull
    protected abstract ViewPager2 initViewPager2();

    @Override
    protected void onCreateView() {
        pagerButton = initPagerButton();
        refreshButton = initRefreshButton();
        viewPager2 = initViewPager2();

        //刷新按钮点击
        refreshButton.setOnClickListener(this);
        //配置翻页按钮
        pagerButton.init(requireActivity(), handler, this);
        // 初始化适配器
        // vp2翻页时同步数据给翻页器
        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                page = position + 1;
                pagerButton.setData(page, totalPage);
            }
        });

    }

    /**
     * 处理消息
     *
     * @param message 消息
     * @return 是否消耗
     */
    @Override
    public boolean handleMessage(@NonNull Message message) {
        // 主题列表分页的查询成功回调
        if (message.what == MessageWhat.ON_SUCCESS_TOPIC_LIST_REQUEST.ordinal()) {
            onSuccessTopicListRequest((ThreadBody) message.obj);
            return true;
        }
        // 锁定 viewPager2 禁止翻页
        if (message.what == MessageWhat.LOCK_VIEW_PAGER.ordinal()) {
//            Log.d(getClass().getSimpleName(), MessageWhat.LOCK_VIEW_PAGER.name());
            viewPager2.setUserInputEnabled(false);
            return true;
        }
        // 解锁 viewPager2
        if (message.what == MessageWhat.UNLOCK_VIEW_PAGER.ordinal()) {
//            Log.d(getClass().getSimpleName(), MessageWhat.UNLOCK_VIEW_PAGER.name());
            viewPager2.setUserInputEnabled(true);
            return true;
        }
        return super.handleMessage(message);
    }

    /**
     * 获取和处理参数
     *
     * @param arguments 参数
     */
    @Override
    protected final void handleArguments(Bundle arguments) {
        if (arguments != null && arguments.getParcelable(ARG_KEY) != null) {
            param = arguments.getParcelable(ARG_KEY);
        } else {
            throw new RequireParamException(ARG_KEY);
        }
    }

    /**
     * 点击事件统一处理
     */
    @Override
    public void onClick(View v) {
        // 刷新按钮
        if (v.getId() == R.id.btn_refresh) {
            Fragment currentFragment = getCurrentFragment(viewPager2.getCurrentItem());
            //执行分页的刷新方法
            if (currentFragment instanceof TopicPageFragment) {
                ((TopicPageFragment) currentFragment).sendRequest(true);
            }
        }
    }

    /**
     * 翻页器执行翻页操作时的回调
     *
     * @param page 目标页数
     */
    @Override
    public void onPageChanged(int page) {
        // 翻页
        viewPager2.setCurrentItem(page - 1, false);
    }

    /**
     * 主题列表分页的查询成功回调
     *
     * @param threadBody 响应结果
     */
    protected void onSuccessTopicListRequest(ThreadBody threadBody) {
        Log.d(this.getClass().getSimpleName(), "查询成功回调: ");
        // 更新最大页数: 如果返回了最大页数, 使用; 否则以当前页+1作为最大页数
        setTotalPage(threadBody.getTotalPage() != null ? threadBody.getTotalPage() : viewPager2.getCurrentItem() + 2);
    }

    /**
     * 初始化适配器(除主题搜索, 收藏夹功能以外，可以直接调用)
     *
     * @param param 参数
     */
    protected final void initAdapter(TopicListParam param) {
        adapter = new FragmentStateAdapter(this) {
            @NonNull
            @Override
            public Fragment createFragment(int position) {
                return TopicPageFragment.newInstance(param, position + 1, showCheckBox);
            }

            @Override
            public int getItemCount() {
                return totalPage;
            }
        };
        // 设置适配器
        viewPager2.setAdapter(adapter);

        // 如果参数指定了页数跳转到指定页
        if (param.page != null) {
            viewPager2.setCurrentItem(param.page - 1, false);
        }
    }

    /**
     * 返回被选中的主题
     *
     * @return 返回被选中的主题
     */
    @Nullable
    public List<TopicItem> getCheckedItem() {
        Fragment fragment = getCurrentFragment(viewPager2.getCurrentItem());
        if (fragment instanceof TopicPageFragment) {
            return ((TopicPageFragment) fragment).getCheckedItem();
        }
        return null;
    }

    /**
     * 设置本页所有主题的选中状态
     *
     * @param isChecked 是否选中
     */
    @SuppressLint("NotifyDataSetChanged")
    public void setAllChecked(boolean isChecked) {
        Fragment fragment = getCurrentFragment(viewPager2.getCurrentItem());
        if (fragment instanceof TopicPageFragment) {
            ((TopicPageFragment) fragment).setAllChecked(isChecked);
        }
    }


    /**
     * 设置参数
     *
     * @param param 参数
     */
    public void setArguments(@NonNull TopicListParam param) {
        Bundle args = new Bundle();
        args.putParcelable(ARG_KEY, param);
        setArguments(args);
    }

    /**
     * 更新总页数
     *
     * @param totalPage 总页数
     */
    public void setTotalPage(int totalPage) {
        this.totalPage = Math.max(totalPage, this.totalPage);
        Log.d(this.getClass().getSimpleName(), "更新总页数: " + this.totalPage);
        if (pagerButton != null) {
            pagerButton.setData(viewPager2.getCurrentItem() + 1, totalPage);
        }
    }
}
